{******************************************************************

                       JEDI-VCL Demo

 Copyright (C) 2002 Project JEDI

 Original author:

 Contributor(s):

 You may retrieve the latest version of this file at the JEDI-JVCL
 home page, located at http://jvcl.delphi-jedi.org

 The contents of this file are used with permission, subject to
 the Mozilla Public License Version 1.1 (the "License"); you may
 not use this file except in compliance with the License. You may
 obtain a copy of the License at
 http://www.mozilla.org/MPL/MPL-1_1Final.html

 Software distributed under the License is distributed on an
 "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
 implied. See the License for the specific language governing
 rights and limitations under the License.

******************************************************************}

unit PageDemo;

interface

uses
  SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  Forms, Dialogs, StdCtrls, DBCtrls, DB, DBTables, JvPageManager,
  JvComponent, JvFormPlacement, JvBDEQuery, JvDBCombobox, JvToolEdit,
  JvDBControls, Mask, JvLabel, Grids, DBGrids, ExtCtrls, JvExControls,
  JvDBGrid, JvExStdCtrls, JvExMask, JvExDBGrids;

type
  TClientAssistanceMode = (camNew, camEdit, camDelete, camView);
  TClientAssistantPage = (pageToDo, pageSearchConfirm, pageSearchParams,
    pageClientsBrowse, pageClientEdit);

  TClientAssistant = class(TForm)
    BtnPanel: TPanel;
    Bevel1: TBevel;
    Notebook: TNotebook;
    BackBtn: TButton;
    NextBtn: TButton;
    CloseBtn: TButton;
    SaveBtn: TButton;
    NewBtn: TRadioButton;
    EditBtn: TRadioButton;
    DeleteBtn: TRadioButton;
    ClientsDS: TDataSource;
    Image1: TImage;
    Label1: TLabel;
    Label16: TLabel;
    ViewBtn: TRadioButton;
    Image2: TImage;
    Label17: TLabel;
    Label19: TLabel;
    Label20: TLabel;
    Label21: TLabel;
    Label23: TLabel;
    Label27: TLabel;
    SrchName: TEdit;
    SrchFirstName: TEdit;
    SrchCity: TEdit;
    SrchState: TEdit;
    SrchOccupation: TEdit;
    ExactBtn: TCheckBox;
    DoSearchBtn: TRadioButton;
    SkipSearchBtn: TRadioButton;
    Image3: TImage;
    NewSearchHint: TLabel;
    Label24: TLabel;
    Image4: TImage;
    Label25: TLabel;
    Grid: TJvDBGrid ;
    SearchQuery: TJvQuery ;
    SearchQueryDS: TDataSource;
    FormStorage: TJvFormStorage ;
    PageManager: TJvPageManager ;
    ToDo: TJvPageProxy ;
    SearchConfirm: TJvPageProxy ;
    SearchParams: TJvPageProxy ;
    ClientsBrowse: TJvPageProxy ;
    ClientEdit: TJvPageProxy ;
    Clients: TTable;
    SearchQueryLAST_NAME: TStringField;
    SearchQueryFIRST_NAME: TStringField;
    SearchQueryACCT_NBR: TFloatField;
    SearchQueryADDRESS_1: TStringField;
    SearchQueryCITY: TStringField;
    SearchQuerySTATE: TStringField;
    SearchQueryZIP: TStringField;
    SearchQueryTELEPHONE: TStringField;
    SearchQueryDATE_OPEN: TDateField;
    SearchQuerySS_NUMBER: TFloatField;
    SearchQueryBIRTH_DATE: TDateField;
    SearchQueryRISK_LEVEL: TStringField;
    SearchQueryOCCUPATION: TStringField;
    SearchQueryOBJECTIVES: TStringField;
    SearchQueryINTERESTS: TStringField;
    Image5: TImage;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label8: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    Label14: TLabel;
    EditACCT_NBR: TDBEdit;
    EditFIRST_NAME: TDBEdit;
    EditADDRESS_: TDBEdit;
    EditCITY: TDBEdit;
    EditSTATE: TDBEdit;
    EditZIP: TDBEdit;
    EditTELEPHONE: TDBEdit;
    EditOCCUPATION: TDBEdit;
    EditLAST_NAME: TDBEdit;
    Label9: TLabel;
    Label10: TLabel;
    EditSS_NUMBER: TDBEdit;
    Label13: TLabel;
    Label15: TLabel;
    EditOBJECTIVES: TDBEdit;
    EditBIRTH_DATE: TJvDBDateEdit ;
    Label5: TLabel;
    EditINTERESTS: TDBEdit;
    EditIMAGE: TDBImage;
    EditDATE_OPEN: TJvDBDateEdit ;
    RxLabel1: TJvLabel ;
    ClientsLAST_NAME: TStringField;
    ClientsFIRST_NAME: TStringField;
    ClientsACCT_NBR: TFloatField;
    ClientsADDRESS_1: TStringField;
    ClientsCITY: TStringField;
    ClientsSTATE: TStringField;
    ClientsZIP: TStringField;
    ClientsTELEPHONE: TStringField;
    ClientsDATE_OPEN: TDateField;
    ClientsSS_NUMBER: TFloatField;
    ClientsPICTURE: TStringField;
    ClientsBIRTH_DATE: TDateField;
    ClientsRISK_LEVEL: TStringField;
    ClientsOCCUPATION: TStringField;
    ClientsOBJECTIVES: TStringField;
    ClientsINTERESTS: TStringField;
    ClientsIMAGE: TBlobField;
    ComboRISK_LEVEL: TJvDBComboBox;
    procedure SaveBtnClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure PageManagerGetNextPage(CurrentPage: Integer;
      var NewPage: Integer);
    procedure PageManagerGetPriorPage(CurrentPage: Integer;
      var NewPage: Integer);
    procedure ToDoLeave(Next: Boolean);
    procedure SearchParamsLeave(Next: Boolean);
    procedure ClientsBrowseLeave(Next: Boolean);
    procedure ClientEditEnter(Next: Boolean);
    procedure ClientEditLeave(Next: Boolean);
    procedure ClientsBrowseShow(Next: Boolean);
    procedure CloseBtnClick(Sender: TObject);
    procedure ClientDataChange(Sender: TField);
    procedure ClientEditShow(Next: Boolean);
    procedure EditChange(Sender: TObject);
  private
    { Private declarations }
    procedure DoSearch;
  public
    { Public declarations }
    Mode: TClientAssistanceMode;
  end;

implementation

uses JvDBUtils, JvBdeUtils, Main;

{$R *.DFM}

{$B-}

procedure TClientAssistant.FormCreate(Sender: TObject);
begin
  Clients.Open;
end;

procedure TClientAssistant.SaveBtnClick(Sender: TObject);
begin
  Clients.Post;
  PageManager.SetPage(Integer(pageToDo), True);
end;

procedure TClientAssistant.ToDoLeave(Next: Boolean);
begin
  if NewBtn.Checked then Mode := camNew
  else if EditBtn.Checked then Mode := camEdit
  else if DeleteBtn.Checked then Mode := camDelete
  else if ViewBtn.Checked then Mode := camView;
end;

procedure TClientAssistant.SearchParamsLeave(Next: Boolean);
begin
  if Next then DoSearch;
end;

procedure TClientAssistant.ClientsBrowseLeave(Next: Boolean);
begin
  if Next then begin
    if IsDataSetEmpty(SearchQuery) or not
      DataSetFindValue(Clients, SearchQuery.FieldByName('ACCT_NBR').AsString,
        'ACCT_NBR') then DatabaseError('No data found');
    if (Mode = camDelete) and ConfirmDelete then begin
      Clients.Delete;
      RefreshQuery(SearchQuery);
    end;
  end
  else SearchQuery.Close;
end;

procedure TClientAssistant.ClientEditEnter(Next: Boolean);
begin
  if Mode = camNew then Clients.Append
  else if Mode = camEdit then Clients.Edit;
  SaveBtn.Visible := (Clients.State in [dsInsert, dsEdit]);
  SaveBtn.Enabled := False;
end;

procedure TClientAssistant.ClientEditLeave(Next: Boolean);
begin
  if not Next then ConfirmDataSetCancel(Clients);
  SaveBtn.Visible := False;
end;

procedure TClientAssistant.DoSearch;
begin
  with SearchQuery do begin
    Close;
    MacroByName('LAST_NAME').AsString := FormatSQLCondition('LAST_NAME',
      '', SrchName.Text, ftString, ExactBtn.Checked);
    MacroByName('FIRST_NAME').AsString := FormatSQLCondition('FIRST_NAME',
      '', SrchFirstName.Text, ftString, ExactBtn.Checked);
    MacroByName('CITY').AsString := FormatSQLCondition('CITY',
      '', SrchCity.Text, ftString, ExactBtn.Checked);
    MacroByName('OCCUPATION').AsString := FormatSQLCondition('OCCUPATION',
      '', SrchOccupation.Text, ftString, ExactBtn.Checked);
    MacroByName('STATE').AsString := FormatSQLCondition('STATE',
      '', SrchState.Text, ftString, ExactBtn.Checked);
    Open;
  end;
end;

procedure TClientAssistant.FormCloseQuery(Sender: TObject;
  var CanClose: Boolean);
begin
  Clients.Cancel;
end;

procedure TClientAssistant.PageManagerGetNextPage(CurrentPage: Integer;
  var NewPage: Integer);
begin
  case TClientAssistantPage(CurrentPage) of
    pageTodo:
      begin
        case Mode of
          camNew:
            NewPage := Integer(pageSearchConfirm);
          camEdit, camDelete, camView:
            NewPage := Integer(pageSearchParams);
        end;
      end;
    pageSearchConfirm:
      begin
        if DoSearchBtn.Checked then
          NewPage := Integer(pageSearchParams)
        else if SkipSearchBtn.Checked then
          NewPage := Integer(pageClientEdit);
      end;
    pageSearchParams: NewPage := Succ(CurrentPage);
    pageClientsBrowse:
      begin
        NewPage := Succ(CurrentPage);
        if Mode = camDelete then NewPage := CurrentPage
        else if Mode in [camEdit, camView] then begin
          if IsDataSetEmpty(SearchQuery) then NewPage := -1;
        end;
      end;
    pageClientEdit: NewPage := -1;
  end;
end;

procedure TClientAssistant.PageManagerGetPriorPage(CurrentPage: Integer;
  var NewPage: Integer);
begin
  case TClientAssistantPage(CurrentPage) of
    pageTodo: NewPage := -1;
    pageSearchConfirm: NewPage := Pred(CurrentPage);
    pageSearchParams:
      begin
        case Mode of
          camNew:
            NewPage := Integer(pageSearchConfirm);
          camEdit, camDelete, camView:
            NewPage := Integer(pageToDo);
        end;
      end;
    pageClientsBrowse: NewPage := Pred(CurrentPage);
    pageClientEdit:
      begin
        if not DoSearchBtn.Checked and (Mode = camNew) then
          NewPage := Integer(pageSearchConfirm)
        else NewPage := Integer(pageClientsBrowse);
      end;
  end;
end;

procedure TClientAssistant.ClientsBrowseShow(Next: Boolean);
begin
  ActiveControl := Grid;
end;

procedure TClientAssistant.CloseBtnClick(Sender: TObject);
begin
  Close;
end;

procedure TClientAssistant.ClientDataChange(Sender: TField);
begin
  SaveBtn.Enabled := True;
end;

procedure TClientAssistant.ClientEditShow(Next: Boolean);
begin
  ActiveControl := EditACCT_NBR;
end;

procedure TClientAssistant.EditChange(Sender: TObject);
begin
  SaveBtn.Enabled := True;
end;

end.